CoT 思维链
CoT = Chain-of-Thought(思维链),出自 2022 年 1 月的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Mo…
CoT 思维链:把中间步骤写出来,以及它并不等于模型在思考
阅读提示 本笔记面向已经理解 LLM 与 Prompt 基本概念、正在学 Agent 的读者。主线是:直接作答为什么会崩 → CoT 到底改了什么 → 三种形态各自解决什么 → 为什么有效且依赖模型规模 → 它最容易被误解的两件事 → 今天还需不需要手写。
演化脉络与 Agent 的关系单独成篇,见 从 CoT 到 Agent 推理体系;下游范式见 ReAct 范式;整体框架见 Agent概念。
⚠️ = 常见陷阱 🆚 = 对比辨析 💡 = 机制或选择建议
目录
- 一、不给中间步骤,模型会在哪里崩?
- 二、CoT 到底改了什么?
- 三、CoT 的三种形态分别解决什么?
- 四、为什么写出步骤就会更准?
- 五、为什么小模型用 CoT 反而更差?
- 六、CoT 写出来的步骤,是模型真实的推理过程吗?
- 七、今天还需要手写 CoT 吗?
- 常见说法订正
- 速查表
- 复习重点
核心概念 CoT = Chain-of-Thought(思维链),出自 2022 年 1 月的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》(Jason Wei 等,Google Research,arXiv 2201.11903,NeurIPS 2022)。
一句话:不让模型从问题直接跳到答案,而是先生成一串中间推理步骤,再给出答案。
普通 Prompt: 问题 ─────────────────────→ 答案 CoT: 问题 → 步骤1 → 步骤2 → … → 答案论文的实证力度是它当年引爆的原因:仅用 8 个思维链示例提示 540B 的 PaLM,就在 GSM8K 小学数学应用题上刷新了当时的最优成绩,超过了配备验证器的微调 GPT-3——没有改一个参数。
一、不给中间步骤,模型会在哪里崩?
GPT-3(2020)确立了 Few-shot Learning 的用法:给几个示例,模型就学会任务。
Q: 2 + 3 = ?
A: 5
Q: 10 + 8 = ?
A: 18
Q: 23 + 19 = ?
A: ← 模型输出 42这套写法在分类、翻译、简单问答上都成立。问题出在需要多步的题目上:
小明有 23 元,买了 3 支每支 4 元的笔,然后妈妈又给了他 15 元。现在有多少钱?
如果 Prompt 的格式是 Q → A,模型必须在一次前向传播、一个 token 的位置上同时完成三步运算:
3 × 4 = 12
23 - 12 = 11
11 + 15 = 26这三步之间存在严格的顺序依赖——第二步要用第一步的结果。而模型被要求把它们全部压进「输出第一个数字」这一步里。错的往往不是算术能力,是没有地方放中间结果。
换个角度理解 Transformer 每生成一个 token,计算深度是固定的(层数固定)。多步推理需要的计算深度却随步数增长。把中间步骤写进输出,等于用生成序列的长度换取计算的深度——每写出一步,就等于多跑了一轮完整的前向计算,且上一步的结论作为文本进入了下一步的上下文。
这也是为什么 CoT 不是"提醒模型认真点",而是实打实地改变了可用的计算量。
二、CoT 到底改了什么?
改动小到近乎朴素:在示例里,把答案换成"推理过程 + 答案"。
原论文的示例(Roger 网球问题):
❌ 改之前
Q: Roger has 5 tennis balls. He buys 2 more cans of tennis balls.
Each can has 3 tennis balls. How many tennis balls does he have now?
A: 11✅ 改之后(这就是一条 chain of thought)
Q: Roger has 5 tennis balls. He buys 2 more cans of tennis balls.
Each can has 3 tennis balls. How many tennis balls does he have now?
A: Roger started with 5 balls.
2 cans of 3 tennis balls each is 6 tennis balls.
5 + 6 = 11.
The answer is 11.关键在于:示例里的推理过程,是给模型看的格式模板,不是给人看的注释。 模型在处理新问题时会模仿这个格式,于是也开始逐步展开。
⚠️ 最常见的失效写法:示例只有答案 错误操作: 给了 8 个示例,但每个都写成
Q: … A: 42,然后在指令里加一句"请一步步推理"。实际结果: 模型大概率仍然直接输出答案。少数情况下输出格式混乱——一半示例风格,一半推理风格。
原因: Few-shot 的作用机制是格式模仿,不是指令理解。示例的格式权重远高于指令里的一句要求,二者冲突时示例胜出。
正确做法: 要么示例里全部带推理过程(Few-shot CoT),要么干脆不给示例、只用触发语(Zero-shot CoT)。不要混用。
三、CoT 的三种形态分别解决什么?
上图按论文首次提交时间排列,横向读每一行就是该形态的数据流。三行的差别只在一处:中间那个蓝色框(推理链)是怎么被诱导出来的,以及有几条。
⚠️ 时间顺序容易记反 很多中文资料把顺序讲成「CoT → Zero-shot CoT → Self-Consistency」,暗示后者是前者的改良。
实际提交时间:Few-shot CoT 2022-01-28 → Self-Consistency 2022-03-21 → Zero-shot CoT 2022-05-24。
Self-Consistency 早于 Zero-shot CoT 两个月。二者是从原始 CoT 出发的两个并行方向(一个改解码策略,一个改触发方式),不是递进改良。记成递进关系会误判它们的因果。
3.1 Few-shot CoT:给范例,让它模仿
即原始论文的做法,上一节已经展开。特点是可控——你能通过示例精确规定推理的粒度、风格和输出格式。代价是要人工写示例,且示例质量直接决定效果。
3.2 Self-Consistency:采样多条链,投票
原始 CoT 有个结构性弱点:
问题 → 步骤1 → 步骤2(错了) → 步骤3 → 答案(必错)单条链上任何一步出错,后面全部跟着错,而且模型会自信地把错误推下去。
Self-Consistency(Wang Xuezhi 等,arXiv 2203.11171)的做法:不要只解码一次,而是采样出多条不同的推理路径,再对最终答案做多数投票(论文原话是 marginalize out 掉采样的推理路径)。
论文报告的增益:
| 基准 | 相对 CoT 的提升 |
|---|---|
| GSM8K | +17.9% |
| SVAMP | +11.0% |
| AQuA | +12.2% |
| StrategyQA | +6.4% |
| ARC-challenge | +3.9% |
它的前提假设很重要:复杂问题往往有多条不同的正确解法,但都通向同一个答案。错误则倾向于各错各的、不一致。所以"最一致的答案"是正确答案的良好代理。
⚠️ Self-Consistency 不是万能的 错误操作: 把它套到摘要生成、文案撰写、开放问答上。
实际结果: 无法投票,或者退化成随便挑一条。
原因: 投票要求答案可以被判定相等。数值、选项字母、短实体可以;一段自由文本不行——五条链会生成五段措辞不同的文字,没有多数可言。
正确做法: 只在答案空间离散且可比较的任务上用。开放生成任务要提升质量,应改用 LLM 评分挑选或多轮自我修订,而不是投票。
💡 成本提醒:采样 N 条链就是 N 倍的推理成本。论文里常用 40 条采样。生产环境通常降到 3~5 条,或只对模型置信度低的样本触发。
3.3 Zero-shot CoT:一句触发语替代示例
Kojima Takeshi 等(arXiv 2205.11916)发现:连示例都不用写,只在问题后面加一句:
Let's think step by step.模型就会自己展开推理。论文实测(InstructGPT text-davinci-002 与 PaLM 540B):
| 基准 | 普通零样本 | Zero-shot CoT |
|---|---|---|
| MultiArith | 17.7% | 78.7% |
| GSM8K | 10.4% | 40.7% |
MultiArith 从 17.7% 到 78.7%,靠的是一句提示词。这也是这篇论文标题的由来——Large Language Models are Zero-Shot Reasoners:推理能力本来就在模型里,只是需要被触发。
⚠️ 这句话不出自 CoT 原论文
Let's think step by step被广泛误认为是 Wei et al. 2022 提出的。它出自四个月后的 Zero-shot CoT 论文(Kojima et al., 2205.11916)。原始 CoT 论文用的是 few-shot 示例,通篇没有这句触发语。这是面试和技术文档里的高频错点。
四、为什么写出步骤就会更准?
三个机制叠加,都不神秘:
1. 用序列长度换计算深度。 见第一节的机制说明——每多写一步,就多一轮前向计算。
2. 把中间结论变成上下文。 写下 3 × 4 = 12 之后,这个 12 就成了后续 token 可以直接注意到的文本,不再需要模型"记在心里"。这把隐式状态变成了显式状态。
3. 把大跳跃拆成小跳跃。 每一步的条件概率分布更集中——5 + 6 = ? 比"整道应用题的答案是多少"要好预测得多。
💡 由此可推出一条实践规则 CoT 的收益大小,取决于任务能否被拆成有顺序依赖的小步。
- 收益大:多步算术、多跳问答、逻辑推演、符号操作、代码执行追踪。
- 收益小甚至为负:情感分类、单跳事实检索、格式转换。这类任务本来就是一步的,加 CoT 只会增加 token 成本和跑偏的机会。
五、为什么小模型用 CoT 反而更差?
原论文的一个核心发现是:这种能力是随模型规模「涌现」出来的,在足够大的模型上才明显。
小模型加了 CoT,常常出现:推理链读起来很流畅、逻辑上完全错误,然后基于错误的链给出错误答案——比直接猜还差。
关于「涌现」的一点补充 「涌现」这个说法后来在学界有争议:有研究认为,所谓的突变可能部分来自评测指标的非线性(例如用"完全匹配"这种全对才算分的指标,会把连续的改善显示成阶跃)。
但对使用者而言,实践结论不受影响:在小模型上不要指望 CoT 提示带来大幅推理提升。要小模型具备推理能力,今天的主流做法是用大模型的推理轨迹去蒸馏它,而不是给它写更好的 Prompt。
六、CoT 写出来的步骤,是模型真实的推理过程吗?
这是本篇最需要记住的一节,因为它直接决定你能不能拿 CoT 当审计依据。
答案是:不一定。
Turpin 等的论文《Language Models Don't Always Say What They Think》(arXiv 2305.04388)做了一个干净的实验:给输入注入偏置特征(例如把多选题的正确选项固定排在 A,或在few-shot示例里让答案总是某个选项),然后观察模型的 CoT。
结果:模型的答案明显被偏置带偏,但它生成的推理链完全不提这个偏置,而是编造出一套听起来合情合理的理由来支持那个被诱导的答案。论文的结论原文是——CoT 的解释可以是 "plausible yet misleading"(貌似合理但具误导性)。
不要把 CoT 当作模型内部计算的忠实日志 错误认知: "模型把推理过程写出来了,所以我能看懂它为什么这么答,出问题也能定位。"
实际风险: 推理链是生成出来的文本,和产生答案的内部计算之间没有强制的因果绑定。模型完全可能先(在内部)倾向某个答案,再补一段像样的说辞。这在中文里叫"合理化",不是"推理"。
后果的严重性在于:一段流畅、分步、看起来严谨的 CoT,会显著提高人对错误答案的信任度。它制造的是虚假的透明感。
正确做法:
- 把 CoT 当调试线索,不当正确性证据。
- 关键结论必须由外部可验证的东西兜底:工具调用的真实返回、代码执行结果、检索到的原文。这正是 ReAct 范式 里
Observation存在的意义。- 做审计时,验证的对象应该是行动和观察的轨迹,而不是模型的自述。
七、今天还需要手写 CoT 吗?
大部分场景:不需要了,但要知道是被什么替代的。
2024 年之后,o1、DeepSeek-R1 这类推理模型通过强化学习把长思维链内化进了模型权重。
DeepSeek 的论文(发表于 Nature,2025)里,这个现象的主角是 DeepSeek-R1-Zero:它在没有任何监督微调的前提下,仅用大规模 RL(GRPO 算法,规则化奖励:答案正确性 + 格式合规)训练,就自发涌现出自我验证、反思和策略调整的行为,包括那个著名的 "aha moment"——模型主动停下来重新评估自己的推理。AIME 2024 上 average pass@1 从 15.6% 提升到 77.9%,配合自洽解码可达 86.7%。
⚠️ 把 R1-Zero 的故事安到 R1 头上 错误说法: "DeepSeek-R1 是纯 RL、不用 SFT 训出来的。"
实际情况: "无 SFT、纯 RL、规则奖励、涌现 aha moment"描述的是 R1-Zero,那是一个用来验证「纯 RL 能不能激发推理」的研究性模型。最终发布的 DeepSeek-R1 不是这么训的——它在 RL 之前先用少量高质量长 CoT 数据做了冷启动 SFT,之后还经过了拒绝采样 + SFT + 第二轮 RL 的多阶段流程。原因是 R1-Zero 虽然分数高,但可读性差、中英文混杂。
另一个常见误读: 以为 RL 是"拿 CoT 文本当训练目标"去学怎么写推理链。实际上规则化奖励只看最终答案对不对和格式合不合规,中间那条推理链没有被直接监督——正是因为没人规定它怎么想,模型才"自己发明"出了反思和验证的策略。这是这项工作最关键的一点,说成"用 CoT 训练"就把它讲反了。
数字也要注意版本: 网上流传的 71.0% 来自早期 arXiv 版本,Nature 正式版是 77.9%。
这件事的意义是范式性的:
2022:CoT 是「推理时的提示技巧」——你写 Prompt 去诱导它
2025:CoT 是「训练时的优化目标」——模型被训练成默认就这么想⚠️ 「内化进权重」不等于「推理时不再产生思维链」 容易误读成: 推理模型把推理过程压进了参数里,调用时直接吐答案,所以又快又省。
实际情况正相反: 推理模型在回答前仍然要实实在在地生成一长串 reasoning token(OpenAI 计费里单列的 reasoning tokens、DeepSeek 的
reasoning_content)。这些 token 你大多看不到完整原文,但它们照常消耗时间和费用——推理模型比同级非推理模型慢好几倍、贵好几倍,原因就在这里。被内化的是「什么时候该想、该想多久、想的时候用什么策略」这套行为,不是推理过程本身。换句话说:以前要你写
Let's think step by step才触发的那段展开,现在模型自己触发、而且展开得更长。这对工程决策的影响: 估算成本时别只看输入输出长度,reasoning token 常常是大头;对延迟敏感的链路(用户实时交互、需要串多跳的 Agent 循环)要谨慎上推理模型,或者用它的低推理档位。
💡 什么时候仍然要手写 CoT
- 用非推理模型(成本敏感场景下的小模型、开源基座)——手写 CoT 依然是最便宜的提升手段。
- 需要规定推理的结构——比如强制模型按"提取字段 → 校验 → 计算 → 输出 JSON"的固定骨架走。这是格式控制,不是能力诱导。
- 需要落盘完整轨迹做审计——但请回看第六节,轨迹能证明的东西有限。
反过来,对推理模型不要再叠加
Let's think step by step。它们已经有内部思考阶段,额外的诱导可能干扰其固有的推理格式,甚至适得其反。
常见说法订正
| 常见说法 | 是否准确 | 订正 |
|---|---|---|
| CoT = 让模型"一步步思考" | ⚠️ 不严谨 | 准确说是把中间步骤写进输出序列。写出来才有效,"内心想一下"不构成 CoT |
Let's think step by step 出自 CoT 原论文 |
❌ 错误 | 出自 Zero-shot CoT(Kojima et al., 2205.11916,2022-05) |
| Self-Consistency 是 Zero-shot CoT 的后续改进 | ❌ 错误 | Self-Consistency(2022-03-21)早于 Zero-shot CoT(2022-05-24),两者是并行方向 |
| CoT 对所有任务都有提升 | ❌ 错误 | 单步任务(分类、抽取)收益为零甚至为负,且成本上升 |
| CoT 让我们能看到模型的真实推理 | ❌ 错误 | Turpin et al. (2305.04388) 证明 CoT 可以貌似合理但具误导性,不忠实于内部计算 |
| CoT 的价值是"不用训练就能提升推理" | ⚠️ 已过时 | 2022 年成立;2024 后 o1/R1 用 RL 把长 CoT 内化进权重,CoT 已成为训练目标 |
| CoT 在任何模型上都有效 | ❌ 错误 | 原论文明确指出收益依赖模型规模,小模型上可能产生流畅但错误的推理链 |
| Self-Consistency 就是"多问几次取众数" | ⚠️ 不完整 | 必须是带 CoT 的采样;直接对最终答案重复采样,多样性不足,增益很小 |
| CoT 与 ToT 的区别是"一条链 vs 多条链" | ❌ 不准确 | 多条链是 Self-Consistency。ToT 的关键是状态评估 + 搜索(节点是部分解,不是单个 thought),不是并行采样 |
| DeepSeek-R1 是纯 RL、不用 SFT 训出来的 | ❌ 错误 | 那是 R1-Zero。正式的 R1 走的是冷启动 SFT → RL → 拒绝采样 SFT → 再 RL 的多阶段流程 |
| R1-Zero 的 RL 是"拿 CoT 当训练目标" | ❌ 错误 | 奖励只看最终答案正确性与格式,中间推理链未被直接监督——这正是它能自发涌现策略的原因 |
| R1-Zero 在 AIME 2024 上是 15.6% → 71.0% | ⚠️ 过时 | 71.0% 是早期 arXiv 版;Nature 正式版为 77.9%(自洽解码 86.7%) |
速查表
| 概念 | 要点 |
|---|---|
| CoT 全称 | Chain-of-Thought(思维链),Wei et al., arXiv 2201.11903,2022-01 |
| 一句话定义 | 问题 → 显式中间步骤 → 答案 |
| 标志性成绩 | 8 个示例 + PaLM 540B,GSM8K 刷新 SOTA,超过带验证器的微调 GPT-3 |
| Few-shot CoT | 给带推理的示例;可控但需人工编写 |
| Self-Consistency | 2022-03,采样多链投票;GSM8K +17.9%;仅适用于答案可比较的任务 |
| Zero-shot CoT | 2022-05,Let's think step by step;MultiArith 17.7%→78.7% |
| 三个生效机制 | 序列长度换计算深度/中间结论显式化/大跳跃拆小跳跃 |
| 适用边界 | 多步依赖任务收益大;单步任务收益为零或为负 |
| 规模依赖 | 小模型上可能产出流畅但错误的链,效果不如直接作答 |
| 最大误解 | CoT ≠ 模型的真实推理过程(不忠实性) |
| 今天的地位 | 推理模型已用 RL 将其内化;对推理模型不要再叠加触发语 |
复习重点
复习重点
- 一句话说清 CoT:把中间推理步骤写进输出序列,用序列长度换计算深度,同时把隐式的中间结论变成显式的上下文。
- 最容易写错的实现细节:Few-shot 示例必须全部带推理过程。示例只给答案、靠指令补一句"请一步步推理",格式模仿会压过指令,基本无效。
- 最容易记错的时间线:Self-Consistency(2022-03)早于 Zero-shot CoT(2022-05)。二者是并行分支,不是递进改良。
- 最容易记错的出处:
Let's think step by step属于 Zero-shot CoT,不属于 CoT 原论文。- 最危险的认知偏差:一段流畅分步的 CoT 会大幅提高人对答案的信任,但它可能只是对已选答案的事后合理化。要正确性保证,请依赖工具返回值和可执行验证,不要依赖模型的自述。
- 选型规则:多步依赖任务 → 用;单步任务 → 不用;答案离散且预算允许 → 叠加 Self-Consistency;已在用推理模型 → 不要再手写触发语。
- 引用 DeepSeek 时别张冠李戴:"无 SFT、纯 RL、涌现 aha moment、AIME 15.6%→77.9%"全部属于 R1-Zero;正式的 R1 是冷启动 SFT + 多阶段训练。且 RL 奖励只管答案和格式,没有直接监督推理链。
一句话总结 CoT 的贡献不是"教会模型推理",而是把中间推理步骤变成了一个可以被写出来、被采样、被评估、被搜索的对象。正因为它变成了对象,后面才可能长出 Self-Consistency 的投票、ToT 的搜索、ReAct 的工具调用——这条演化线索见 从 CoT 到 Agent 推理体系。